#include "NegaMaxAI.h"

NegaMaxAI::NegaMaxAI()
{
    maxDep = 3;
    qDebug() << "NegaMax maxDep:" << maxDep;

}

void NegaMaxAI::computerMove()
{
    Step *bestStep = NULL;
    int maxMinValues = INT_MIN; //人下完电脑的最低分中最高的

    clock_t startTime = clock();
    QVector<Step *> steps;
    getAllCanSteps(steps);
    //模拟走棋算出最高分
    while (steps.count()) {
        Step *step = steps.back();
        moveStone(step->fromId, step->rowTo, step->colTo);
        if (step->toId >= 0)
            stones[step->toId].isAlive = false;

//        int tmpScore = calcScore();
//        int tmpScore = getMinScore(1, maxMinValues);
        int tmpScore = negaMax(1);
//        int tmpScore = alphaBeta(maxDep, INT_MIN, INT_MAX);

        //还原
        if (step->toId >= 0)
            stones[step->toId].isAlive = true;
        moveStone(step->fromId, step->rowFrom, step->colFrom);

        if (tmpScore > maxMinValues) {
            maxMinValues = tmpScore;
            if (bestStep)
                delete bestStep;
            bestStep = step;
//            qDebug() << "tmpScore:" << tmpScore;
        } else
            delete step;
        steps.removeLast();
    }
    clock_t endTime = clock();
    qDebug() << "耗时：" << endTime - startTime;

    saveStep(bestStep->fromId, bestStep->rowTo, bestStep->colTo, bestStep->toId);
    if (bestStep->toId >= 0)
        stones[bestStep->toId].isAlive = false;
    moveStone(bestStep->fromId, bestStep->rowTo, bestStep->colTo);
    delete bestStep;
    checkWin();
    update();
}

int NegaMaxAI::negaMax(int lv)
{
    if (lv >= maxDep)
        return calcScore();
//    if (!stones[4].isAlive || !stones[20].isAlive) return calcScore();
    int value, bestValue = INT_MAX;
    QVector<Step*> steps;
    getAllCanSteps(steps);
    while (steps.count()){
        Step *step = steps.back();
        //试走，产生新节点
        moveStone(step->fromId, step->rowTo, step->colTo);
        if (step->toId >= 0)
            stones[step->toId].isAlive = false;
        value = -negaMax(lv+1); //递归搜索子节点
        //还原
        if (step->toId >= 0)
            stones[step->toId].isAlive = true;
        moveStone(step->fromId, step->rowFrom, step->colFrom);
//        //剪枝
//        if (value <= curBestValue) {
//            steps.clear();
//            return value;
//        }
        if (value < bestValue)
            bestValue = value;
        steps.removeLast();
    }
    return bestValue;
}

//Step *bestStep = NULL;
//void NegaMaxAI::computerMove()
//{
//    clock_t startTime = clock();
//    negaMax(1);
//    clock_t endTime = clock();
//    qDebug() << "耗时：" << endTime - startTime;
//    moveStone(bestStep->fromId, bestStep->rowTo, bestStep->colTo);
//    if (bestStep->toId >= 0)
//        stones[bestStep->toId].isAlive = false;
//    delete bestStep;
//    checkWin();
//    update();
//}

//int NegaMaxAI::negaMax(int lv)
//{
//    if (lv >= maxDep || !stones[4].isAlive || !stones[20].isAlive)
//        return calcScore();
//    int value, bestValue = INT_MIN;
//    QVector<Step*> steps;
//    getAllCanSteps(steps);
//    while (steps.count()){
//        Step *step = steps.back();
//        //试走，产生新节点
//        moveStone(step->fromId, step->rowTo, step->colTo);
//        if (step->toId >= 0)
//            stones[step->toId].isAlive = false;
//        value = -negaMax(lv+1); //递归搜索子节点
//        //还原
//        if (step->toId >= 0)
//            stones[step->toId].isAlive = true;
//        moveStone(step->fromId, step->rowFrom, step->colFrom);
//        if (value > bestValue) {
//            bestValue = value;
//            if (lv == 1) {
////                if (bestStep)
////                    delete bestStep;
//                bestStep = step;
//                qDebug() << value;
//            }
//        }
//        steps.removeLast();
//    }
//    return bestValue;
//}
